package com.dh.leetcode.six;

import org.junit.Assert;
import org.junit.Test;

/**
 * @ClassName: _605_can_place_flowers
 * @Description: 605. 种花问题
 * 假设你有一个很长的花坛，一部分地块种植了花，另一部分却没有。可是，花卉不能种植在相邻的地块上，它们会争夺水源，两者都会死去。
 * 给定一个花坛（表示为一个数组包含0和1，其中0表示没种植花，1表示种植了花），和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花？
 * 能则返回True，不能则返回False。
 * <p>
 * 示例 1:
 * <p>
 * 输入: flowerbed = [1,0,0,0,1], n = 1
 * 输出: True
 * 示例 2:
 * <p>
 * 输入: flowerbed = [1,0,0,0,1], n = 2
 * 输出: False
 * 注意:
 * <p>
 * 数组内已种好的花不会违反种植规则。
 * 输入的数组长度范围为 [1, 20000]。
 * n 是非负整数，且不会超过输入数组的大小。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/can-place-flowers
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @Author: shouzimu
 * @Date: 2020/12/10 11:54
 */
public class _605_can_place_flowers {

    /**
     * 判断前 - 当前 - 后 是否都为0
     * @param flowerbed
     * @param n
     * @return
     */
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int length = flowerbed.length;
        for (int i = 0; i < length; i++) {
            boolean pre = i == 0 ? true : flowerbed[i - 1] == 0;
            boolean current = flowerbed[i] == 0;
            boolean next = i == length - 1 ? true : flowerbed[i + 1] == 0;
            if (pre && current && next) {
                n--;
                flowerbed[i] = 1;
            }
            if (n <= 0) {
                break;
            }
        }
        return n <= 0;
    }

    @Test
    public void canPlaceFlowersTest() {
        Assert.assertEquals(true, canPlaceFlowers(new int[]{0, 0, 0, 0, 0, 1, 0, 0}, 0));
        Assert.assertEquals(false, canPlaceFlowers(new int[]{1, 0, 0, 0, 0, 1}, 2));
        Assert.assertEquals(true, canPlaceFlowers(new int[]{1, 0, 0, 0, 1}, 1));
        Assert.assertEquals(false, canPlaceFlowers(new int[]{1, 0, 0, 0, 1}, 2));
    }
}
